package secret

import (
	"encoding/base64"

	"github.com/infraboard/mcube/crypto/cbc"
	"github.com/infraboard/mcube/pb/resource"
)

const (
	encrypKey = "encrypKey"
)

// 需要对明文数据进行加密处理
func NewSecret(spec *Spec) (*Secret, error) {
	if err := spec.Encrypt(); err != nil {
		return nil, err
	}

	return &Secret{
		Meta: resource.NewMeta(),
		Spec: spec,
	}, nil
}

// 加密, 我们使用对称加解密(key):  CBC(iv向量, 同一个密码，多次加密 获取的密文不一样)
// 非对称 需要一对密钥对: 私钥和公钥
func (s *Spec) Encrypt() error {
	cipherText, err := cbc.Encrypt([]byte(s.ApiSecret), []byte(encrypKey))
	if err != nil {
		return err
	}
	// base64编码后赋值
	s.ApiSecret = base64.StdEncoding.EncodeToString(cipherText)
	return nil
}

// 解密
func (s *Spec) Decrypt() error {
	// base64解码
	cipterText, err := base64.StdEncoding.DecodeString(s.ApiSecret)
	if err != nil {
		return err
	}

	planText, err := cbc.Decrypt(cipterText, []byte(encrypKey))
	if err != nil {
		return err
	}

	s.ApiSecret = string(planText)
	return nil
}
